<template>
  <!-- 项目选择 -->
  <a-select
    :show-search="showSearch"
    optionFilterProp="children"
    :filter-option="filterOption"
    v-model="currentValue"
    v-bind="$attrs"
    :placeholder="placeholder"
    v-on="listeners"
  >
    <a-icon
      v-if="fetching"
      slot="suffixIcon"
      style="color: #096dd9"
      type="loading"
    />
    <a-spin
      v-if="fetching"
      slot="notFoundContent"
      size="small"
    />
    <a-select-option
      v-for="i in project"
      :key="i.code"
      :value="i.code"
    >
      {{ i.name }}
    </a-select-option>
  </a-select>
</template>
<script>
import { getProject, getAuditProject } from '@/api/themeChoose/themeChoose'
import cloneDeep from 'lodash.clonedeep' // 深拷贝

export default {
  name: 'SelectProject',
  props: {
    // v-model绑定的数据
    value: {
      type: [Array, String, Object, Number]
    },
    // 需要联动的表单名，
    form: {
      type: Object,
      default: () => ({})
    },
    // placeholder
    placeholder: {
      type: String,
      default: () => '请选择'
    },
    // 需要联动的表单名
    keyValue: {
      type: String,
      default: () => 'branchCompanyId'
    },
    // 联动表单值改变时是否清空当前表单值
    isClear: {
      type: Boolean,
      default: () => true
    },
    // 项目审批状态
    auditStatus: {
      type: String,
      default: () => 'PAST'
    },
    //如果是编辑，第一次不要重置绑定的值。。。。
    isEdit: {
      type: Boolean,
      default: () => false
    },
    // 是否为登陆人权限内的项目
    isSelf: {
      type: Boolean,
      default: () => true
    },
    // 是否自动选中第一行
    autoSelected: {
      type: Boolean,
      default: () => true
    },
    // 是否需要显示维保期的项目
    isMaintenance: {
      type: Boolean,
      default: () => false
    },
    // 是否筛选出当前登录项目部的项目
    onlyCurrentPd: {
      type: Boolean,
      default: false
    },
    // 是否需要关联，如果为true，那么在没有关联项时不会请求数据
    needLink: {
      type: Boolean,
      default: true
    },
    // 是否自动选中登录人所在项目
    isDefaultSelected: {
      type: Boolean,
      default: () => false
    },
    // 单位的层级，用于映射不同的参数请求项目
    unitCode: {
      type: String,
      default: () => ''
    },
    //用于有些分公司需要清理项目
    empty: {
      type: Boolean,
      default: () => false
    },
    //用于有些分公司需要清理项目
    emptyId: {
      type: String,
      default: () => ''
    },
    isUseChangeEvent: {
      type: Boolean,
      default: () => false
    },
    // 是否要传缓建项目
    isPostpone: {
      type: Boolean,
      default: () => false
    },

    showSearch: {
      type: Boolean,
      default: () => true
    }
  },
  mounted() {
    // 获取当前登录人选中岗位的组织层级
    this.orgLevel = JSON.parse(sessionStorage.getItem('ycloud-user_info'))?.currentPost?.code
    this.getList()
  },
  data() {
    return {
      useOrgIdCount: 0,
      // isCanClear: !this.isEdit, //data里获取到的值，早于prop传的，应该用watch来设置值
      isCanClear: null, // 是否清除
      fetching: false, // 加载控件
      project: [], // 项目列表
      orgLevel: '', // 当前登录人选中岗位的组织层级
      userInfo: JSON.parse(sessionStorage.getItem('ycloud-user_info'))
    }
  },
  methods: {
    /**
     * 获取项目列表
     */
    getList() {
      this.$nextTick(() => {
        if (!this.attr && this.needLink) {
          // if (!this.attr && this.orgLevel != 'PD') {
          return
        }
        // console.log(this.form[this.keyValue])
        if (this.empty && this.attr == this.emptyId) {
          this.project = []
          this.currentValue = undefined
          return
        }
        const api = this.isSelf ? getAuditProject : getProject
        let params
        // 非登录人参数
        if (!this.isSelf) {
          params = {
            query: {
              branchComIds: this.attr ? [this.attr] : [], // 分公司
              auditStatus: this.auditStatus // 添加审核状态
            }
          }
          // 登录人参数
        } else {
          params = {}
          if (this.orgLevel != 'PD' && this.unitCode !== 'CO') {
            params.branchComIds = this.attr ? [this.attr] : []
          }
          if (this.isMaintenance) {
            params.projectStatus = '1,2,3,4,5,6'
          }
          if (this.isPostpone) {
            params.projectStatus = '1,2,3,4'
          }
          if (this.isDefaultSelected) {
            params.deptOrgIds = [this.userInfo.currentPost.id]
          }
        }
        this.fetching = true
        api(params)
          .then((res) => {
            this.fetching = false
            // 统一项目列表字段配置
            this.project = this.isSelf
              ? res.data?.map((i) => ({
                  code: i.projectId,
                  name: i.projectName,
                  projectDeptId: i.projectDeptId,
                  $origin: i
                }))
              : res.data ?? []
            // 筛选出项目部所在的项目
            if (this.onlyCurrentPd) {
              const currentPost = JSON.parse(sessionStorage.getItem('ycloud-user_info'))?.currentPost || {}
              if (currentPost.code === 'PD') {
                this.project = this.project.filter((item) => item.projectDeptId === currentPost.id)
              }
            }
            // 当没有选中项时，若是登陆人权限列表、支持选中且列表第一项存在则添加默认值
            if (!this.currentValue && this.isSelf && this.autoSelected && this.project[0]?.code) {
              // this.$emit('input', this.project[0].code)
              //默认选中后触发change事件
              let value = this.$attrs.hasOwnProperty('labelInValue') ? { key: this.project[0].code, label: this.project[0].name } : this.project[0].code // labelInValue存在时，返回labelInValue对象
              this.$emit('input', value)
              this.$emit('change', value)
              this.$emit('autoSelected', value)
              this.$emit('selectChange', this.project[0])
            } else if (this.currentValue) {
              // console.log(this.project?.find((item) => item.code === this.currentValue))
              this.$emit(
                'selectChange',
                this.project?.find((item) => item.code === this.currentValue)
              )
            }
            if (this.isDefaultSelected && !this.isSelf) {
              // this.$emit('input', this.project[0].code)
              //默认选中后触发change事件
              getProject({
                query: {
                  branchComIds: [this.attr], // 分公司
                  auditStatus: this.auditStatus, // 添加审核状态
                  deptOrgIds: [this.userInfo.currentPost.id]
                }
              }).then((e) => {
                if (e?.code === 200) {
                  let value = this.$attrs.hasOwnProperty('labelInValue') ? { key: e.data?.[0]?.code, label: e.data?.[0]?.name } : e.data?.[0]?.code // labelInValue存在时，返回labelInValue对象
                  this.$emit('input', value)
                  this.$emit('change', value)
                  this.$emit('autoSelected', value)
                  this.$emit('selectChange', value)
                }
              })
            }
          })
          .catch((res) => {
            this.fetching = false
            this.$message.error(res?.data?.message || '获取项目列表失败！')
          })
      })
    },
    /**
     * 获取指定项目的name
     */
    getValueName(id) {
      const target = this.project.find((item) => item.code === id)
      return (target && target.name) || void 0
    },
    filterOption(input, option) {
      return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
    }
  },
  computed: {
    // 需要联动的表单值
    attr() {
      let attrValue
      const keys = this.keyValue.split('.')
      const findValueFromKeys = (data, key) => {
        if(data instanceof Object && keys.some(k => k === key)){
          return findValueFromKeys(data[key], keys[keys.findIndex(k => k === key) + 1])
        }
        return data
      }
      if(keys && !!keys.length){
        attrValue = findValueFromKeys(this.form, keys[0])
      }
      return attrValue
    },
    // 转换绑定的选中数据，与v-model同步
    currentValue: {
      get: function () {
        return this.value
      },
      set: function (value) {
        this.$emit('input', value)
        //2021-11-18备注：bug出现在，公司岗位时，bform里面切换了公司，项目部不能置空，因为andt表单只监听change事件，绝绝了。啥j2bug我都遇得到
        //2021-12-8备注：在传统表单（a-from-modal）里面，触发change事件，会出现那个rules里面的验证，这事加个判断，是否使用change事件。默认不使用
        //因为传统表单用不上，只有Bfrom是靠change事件改变值的
        if (this.isUseChangeEvent) {
          this.$emit('change', value)
        }
        let res = this.project.find((v) => v.code === value)
        res && this.$emit('selectChange', res)
      }
    },
    // 事件中删除search避免searchData组件错误的触发search事件导致页面list查询接口传入错误的参数
    listeners() {
      const listeners = cloneDeep(this.$listeners)
      delete listeners.search
      return listeners
    }
  },
  watch: {
    isEdit: {
      handler(val) {
        this.isCanClear = !val
      },
      immediate: true
    },
    // 监听联动表单值重置项目列表
    //2020/12/21备注，在model里面使用，不好使就整个v-if
    /*
*   v-if="visible"
    placeholder="请选择"
    v-model="queryParam.projectId"
    :form="queryParam"
    :isClear="false"
    :isEdit="true"
    keyValue="branchCompanyId"
    *
    *
    * 2021/11/09,更新，上面的使用方法作废
    * 时隔一年，这个组件出现个诡异bug，明明form里面有projectId
    * 用分公司岗位，可以正常使用，用项目部岗位，却显示出出来
    * 经常一上午的排查，发现是下面的代码有问题，
    * this.isCanClear是在data里面取的isEdit的反值，
    * isEdit的默认值是false，外面的prop传出去的true
    * 在data里面是获取不到的，所以isCanClear恒定为true
    * 下面的代码会执行this.currentValue
    *         *   // 清空表单
        if (this.isEdit && this.isCanClear) {
          this.currentValue = void 0
            this.$emit('resetSelf') // 在搜索组件(SearchData)中重置自身的值
        } else {
            this.isCanClear = true
        }
    *
    * 后面改成watch isEdit的值来更改isCanClear就行了，
    *
* */
    attr(val) {
      // 清空表单
      if (this.isClear && !this.isEdit) {
        this.currentValue = void 0
        this.$emit('resetSelf') // 在搜索组件(SearchData)中重置自身的值
      }
      // 清空表单
      if (this.isEdit && this.isCanClear) {
        this.currentValue = void 0
        this.$emit('resetSelf') // 在搜索组件(SearchData)中重置自身的值
      } else {
        this.isCanClear = true
      }
      // 重置列表
      this.project = []
      val && this.getList()
    }
  }
}
</script>
